package com.rc.web.service.impl;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.rc.common.constant.Code;
import com.rc.common.exception.BusinessException;
import com.rc.pojo.dto.plant.PagePlantDTO;
import com.rc.pojo.dto.plant.PlantAddDTO;
import com.rc.pojo.dto.plant.PlantUpdateDTO;
import com.rc.pojo.po.Area;
import com.rc.pojo.po.Plant;
import com.rc.pojo.vo.plant.PlantPageVO;
import com.rc.pojo.vo.plant.PlantVO;
import com.rc.web.converter.PlantConverter;
import com.rc.web.mapper.PlantMapper;
import com.rc.web.service.AreaService;
import com.rc.web.service.PlantService;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
 * 植物服务实现类
 * 提供植物相关的业务逻辑实现
 */
@Service
@RequiredArgsConstructor(onConstructor = @__(@Lazy))
public class PlantServiceImpl extends ServiceImpl<PlantMapper, Plant> implements PlantService {
    // 植物转换器
    private final PlantConverter plantConverter;
    // 园区服务
    private final AreaService areaService;

    /**
     * 获取所有植物列表
     * @return 植物VO列表
     */
    @Override
    public List<PlantVO> getList() {
        // 查询所有植物
        var plants = mapper.selectAll();
        // 转换为VO列表并返回
        return plants.stream()
                .map(plantConverter::toVO)
                .toList();
    }

    /**
     * 添加植物
     * @param dto 植物添加DTO
     */
    @Override
    public void add(PlantAddDTO dto) {
        // 转换DTO为PO并保存
        var plant = plantConverter.addDTO2PO(dto);
        this.save(plant);
    }

    /**
     * 根据ID删除植物
     * @param id 植物ID
     */
    @Override
    public void deleteOneById(Long id) {
        // 检查该植物下是否有关联的园区
        var areaList = areaService.getByPlantId(id);
        if (!CollectionUtils.isEmpty(areaList)){
            throw new BusinessException(Code.PLANT_HAS_AREA);
        }

        // 删除植物
        var success = this.removeById(id);
        if (!success){
            throw new BusinessException(Code.NO_SUCH_PLANT);
        }
    }

    /**
     * 更新植物信息
     * @param dto 植物更新DTO
     */
    @Override
    public void updateOneById(PlantUpdateDTO dto) {
        // 转换DTO为PO并更新
        var plant = plantConverter.updateDTO2PO(dto);

        var success= this.updateById(plant);
        if (!success){
            throw new BusinessException(Code.NO_SUCH_PLANT);
        }
    }

    /**
     * 分页查询植物
     * @param dto 分页查询条件
     * @return 分页结果
     */
    @Override
    public Page<PlantPageVO> getPage(PagePlantDTO dto) {
        return mapper.selectPage(dto);
    }

    /**
     * 根据ID获取植物详情
     * @param id 植物ID
     * @return 植物VO
     */
    @Override
    public PlantVO getOneById(Long id) {
        var plant = mapper.selectOneById(id);
        return plantConverter.toVO(plant);
    }
}
